﻿#pragma once
#include <string>
#include <iostream>


namespace $RootNamespace$
{

	class $Context$;
	// $IState$ 
	struct $IState$
	{
		virtual void $Handle$($Context$*) = 0;
		virtual std::string getThisStateName() = 0;

	};


	// $Context$ 
	class $Context$
	{

	public:
		// Constructor 
		$Context$($IState$ *$RootNamespace$);
		static void Test();
		// Property 
private:
		$IState$ *m_pCurrentState;
	public:
		$IState$ *getCurrentState();
		void setCurrentState($IState$ *value);
		//Methods
		void Request();
	};


	// $ConcreteStateA$ 
	class $ConcreteStateA$ : public $IState$
	{
		std::string getThisStateName();
	public:
		void $Handle$($Context$ *pContext);

		
	};

	// $ConcreteStateB$ 
	class $ConcreteStateB$ : public $IState$
	{
		std::string getThisStateName();
	public:
		void $Handle$($Context$ *pContext);
		
	};

	// $ConcreteStateC$ 
	class $ConcreteStateC$ : public $IState$
	{
		std::string getThisStateName();
	public:
		void $Handle$($Context$ *pContext);
		
	};

}